/*
 * Copyright (C) 2008 Alessandro Sivieri <alessandro.sivieri@chimera-bellerofonte.eu>.
 *
 *  This file is part of Daex.
 *
 *  Daex is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Foobar is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * <p>In questo package e nei suoi sottopackages sono riunite le classi
 *  di base della logica interna di funzionamento del programma, le
 *  relative interfacce e le eventuali differenti implementazioni.</p>
 * <p>La prima sezione in analisi e' la classe Program: questa definisce
 * i parametri ed i metodi necessari per poter implementare un programma
 * che possa essere utilizzato all'interno di Daex; l'attuale implementazione
 * ne dichiara 3:
 * <ul>
 * <li><b>mp3 encoder</b>: basato sul programma da linea di comando Lame</li>
 * <li><b>ogg encoder</b>: basato sul programma oggenc della suite OggVorbis</li>
 * <li><b>wave encoder</b>: basato sul programma mplayer, utilizzato anche
 * dalle altre categorie come formato intermedio di codifica</li>
 * </ul>
 * Tali implementazioni si ottengono come factory specificando al metodo
 * getInstance() una delle costanti definite nella classe medesima.
 * <br>
 * Eventuali implementazioni possono estendere questa classe o
 * in alternativa la CompleteEncoderProgram, che aggiunge ulteriori
 * funzionalita' come vedremo tra poco. Il percorso del programma deve
 * essere passato al costruttore di superclasse che provvedera' a ricercarlo
 * nel path del sistema e ad aggiungerlo all'interno del file di configurazione.
 * Una sottoclasse dovra' essere agganciata al sistema manualmente, non piu'
 * (ovviamente) tramite la factory.</p>
 * <p>La seconda serie riguarda le implementazioni per dichiarare un encoder:
 * la prima interfaccia, Encoder, dichiara i metodi di base necessari per poter
 * implementare un programma da utilizzare, non solo come eseguibile da lanciare
 * ma anche come dati riguardanti il programma stesso; EncodingList dichiara
 * i metodi per ottenere l'elenco di canzoni associate ad uno specifico encoder
 * e per il setting delle medesime.
 * <br>
 * CompleteEncoder e' la summa di queste due interfacce, ed una classe che
 * voglia avere tutte le funzionalita' necessarie puo' implementare questa o
 * la sua classe astratta CompleteEncoderProgram, che riunisce anche le
 * funzionalita' dichiarate sopra per l'interfaccia Program.
 * <br>
 * DefaultCompleteEncoder e' l'implementazione di default per un encoder completo,
 * e puo' essere utilizzata come base di partenza per eventualmente aggiungere
 * funzionalita'.</p>
 * <p> Nel package infine ci sono gli esecutori dei programmi esterni
 * su cui si basa il funzionamento del programma; l'implementazione basata su una
 * classe di utilita', SwingWorker, dichiarata all'interno della
 * documentazione di tutorial del Sun Jdk 1.5.0 (e successivamente
 * introdotta nel Jdk 1.6.0) per poter avere una sequenza di thread
 * funzionanti e che possano riportare uno stato di avanzamento.</p>
 * 
 * @author Sivieri Alessandro
 * @author Vitucci Nicola
 */
package eu.chimera_bellerofonte.tesi.encoding;